package com.itheima.dao;

import com.github.pagehelper.Page;
import com.itheima.pojo.CheckGroup;
import org.apache.ibatis.annotations.*;

import java.util.List;
import java.util.Map;

/**
 * @author benben278
 * @create 2022-03-13 11:13
 */
@Mapper
public interface CheckGroupDao {
    //新增检查组数据

    /**@SelectKey 注解:
     * statement是要运行的SQL语句，它的返回值通过resultType来指定
     * before表示查询语句statement运行的时机
     * keyProperty表示查询结果赋值给代码中的哪个对象，keyColumn表示将查询结果赋值给数据库表中哪一列
     * keyProperty和keyColumn都不是必需的，有没有都可以
     * before=true，插入之前进行查询，可以将查询结果赋给keyProperty和keyColumn，赋给keyColumn相当于更改数据库
     * befaore=false，先插入，再查询，这时只能将结果赋给keyProperty
     * 赋值给keyProperty用来“读”数据库，赋值给keyColumn用来写数据库
     * selectKey的两大作用：1、生成主键；2、获取刚刚插入数据的主键。
     * 使用selectKey，并且使用MySQL的last_insert_id()函数时，before必为false，也就是说必须先插入然后执行last_insert_id()才能获得刚刚插入数据的ID
     * 如果是MySQL，可以用select last_insert_id()语句获取新插入数据的主键
     */
    /**或者使用@Options注解
     *使用@Options注解的userGeneratedKeys 和keyProperty属性，让数据库auto_increment生成的主键值，赋值到keyProperty标记的属性id中;
     */
    @Insert("insert into t_checkgroup(code,name,sex,helpCode,remark,attention)\n" +
            "values (#{code},#{name},#{sex},#{helpCode},#{remark},#{attention})")
//    @SelectKey(keyProperty="id", before=false, resultType=int.class,statement = "select last_insert_id()")
    @Options(useGeneratedKeys = true, keyProperty = "id")
    void add(CheckGroup checkGroup);
    //设置检查组和检查项的关联关系
    @Insert("insert into t_checkgroup_checkitem(checkgroup_id,checkitem_id)\n" +
            "        values\n" +
            "            (#{checkgroup_id},#{checkitem_id})")
    void setCheckGroupAndCheckItem(Map map);
    //根据条件进行查询
    @Select("<script> select * from t_checkgroup\n" +
            "        <if test=\"value != null and value!='' and value.length > 0\">\n" +
            "            where code = #{value} or name = #{value} or helpCode = #{value}\n" +
            "        </if> </script>")
    Page<CheckGroup> findByCondition(String queryString);
    //根据id查询
    @Select("select * from t_checkgroup where id = #{id}")
    CheckGroup findById(Integer id);
    //根据检查组id查询关联的多个检查项id，查询中间关系表
    @Select("select checkitem_id from t_checkgroup_checkitem where checkgroup_id = #{id}")
    List<Integer> findCheckItemIdsByCheckGroupId(Integer id);
    //根据ID动态修改检查组相关字段
    @Update("<script> update t_checkgroup\n" +
            "        <set>\n" +
            "            <if test=\"name != null\">\n" +
            "                name = #{name},\n" +
            "            </if>\n" +
            "            <if test=\"sex != null\">\n" +
            "                sex = #{sex},\n" +
            "            </if>\n" +
            "            <if test=\"code != null\">\n" +
            "                code = #{code},\n" +
            "            </if>\n" +
            "            <if test=\"helpCode != null\">\n" +
            "                helpCode = #{helpCode},\n" +
            "            </if>\n" +
            "            <if test=\"attention != null\">\n" +
            "                attention = #{attention},\n" +
            "            </if>\n" +
            "            <if test=\"remark != null\">\n" +
            "                remark = #{remark},\n" +
            "            </if>\n" +
            "        </set>\n" +
            "        where id = #{id} </script>")
    void edit(CheckGroup checkGroup);
    //根据检查组id删除中间表数据（清理原有关联关系）
    @Delete("delete from t_checkgroup_checkitem where checkgroup_id = #{id}")
    void deleteAssociation(Integer id);
    //查询所有检查组
    @Select("select * from t_checkgroup")
    List<CheckGroup> findAll();
}
